package com.wfh.aigenerator.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.wfh.aigenerator.common.ErrorCode;
import com.wfh.aigenerator.constant.AppConstant;
import com.wfh.aigenerator.exception.BusinessException;
import com.wfh.aigenerator.model.enums.CodeGenTypeEnums;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.zip.Checksum;

import static com.wfh.aigenerator.core.CodeFileSaver.FILE_SAVE_ROOT_DIR;

/**
 * @Title: CodeFileSaverTemplate
 * @Author wangfenghuan
 * @Package com.wfh.aigenerator.core.saver
 * @Date 2025/7/29 22:02
 * @description:
 */
public abstract class CodeFileSaverTemplate<T> {

    /**
     * 文件的根目录
     */
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;


    /**
     * 模版方法，保存代码的标准流程
     * @param result
     * @return
     */
    public final File saveCode(T result, Long appId){
        // 1、验证输入
        validateInput(result);
        // 2、构建唯一路径
        String baseDirPath = buildFilePath(appId);
        // 3、保存文件，具体时间由子类提供
        saveFiles(result, baseDirPath);
        // 4、返回目录文件对象
        return new File(baseDirPath);
    }

    /**
     * 保存文件，由子类实现
     * @param result
     * @param baseDirPath
     */
   protected abstract void saveFiles(T result, String baseDirPath);

    /**
     * 验证输入，由子类实现
     * @param result
     */
    protected void validateInput(T result) {
        if (result == null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
    }

    /**
     * 构建唯一路径
     * @return
     */
    protected  String buildFilePath(Long appId) {
        if (appId == null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        String codeType = getCodeType().getValue();
        String uniquePath = codeType + "_" + appId;
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniquePath;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 写入单个文件的工具方法
     * @param dirPath
     * @param fileName
     * @param content
     */
    protected final void writeToFile(String dirPath, String fileName, String content) {
        if (StrUtil.isNotBlank(content)){
            String filePath = dirPath + File.separator + fileName;
            FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
        }
    }

    /**
     * 获取代码类型
     * @return
     */
   protected abstract CodeGenTypeEnums getCodeType();
}
